<template>
  <div>
    <!-- 导航栏 -->
    <van-nav-bar title="搜索中心" left-arrow @click-left="$router.back()" />

    <!-- 搜索栏 -->
    <van-search
      v-model="key"
      show-action
      shape="round"
      placeholder="请输入搜索关键词"
      @search="onSearch"
      @input="onInput"
    >
      <template #action>
        <div @click="onSearch">搜索</div>
      </template>
    </van-search>
    <!-- 历史记录 -->
    <van-cell-group v-if="key == ''">
      <van-cell title="历史记录" />
      <van-cell
        v-for="(item, index) in history"
        :key="index"
        :title="item"
        @click="$router.push(`/search/result?key=${item}`)"
      />
    </van-cell-group>

    <!-- 搜索建议 -->
    <van-cell-group v-else>
      <van-cell v-for="(item, index) in colorList" :key="index" icon="search">
        <div
          v-html="item"
          @click="$router.push(`/search/result?key=${suggestList[index]}`)"
        ></div>
      </van-cell>
    </van-cell-group>
  </div>
</template>

<script>
import { suggestAPI } from "@/api/search";
export default {
  data() {
    return {
      key: "",
      suggestList: [],
      history: JSON.parse(localStorage.getItem("history")) || [],
    };
  },
  methods: {
    // 输入框内容发生变化触发
    async onInput() {
      // 非空判断
      if (this.key == "") return;

      // 获得搜索建议
      const res = await suggestAPI({
        q: this.key,
      });

      if (res.data.options[0]) {
        this.suggestList = res.data.options;
      } else {
        // 服务器如果返回的是null就赋值为空数组
        this.suggestList = [];
      }
    },
    onSearch() {
      // 如果为空不要跳转
      if (this.key == "") return this.$toast("请输入点内容");

      // 把搜索的关键字加到数组里
      // 判断在不在数组里，在就不加，不在就加
      if (this.history.indexOf(this.key) == -1) {
        this.history.push(this.key);
      }
      // 再把数组存到本地存储
      localStorage.setItem("history", JSON.stringify(this.history));

      // 跳转到搜索结果页并传递输入的内容
      this.$router.push(`/search/result?key=${this.key}`);
    },
  },

  computed: {
    colorList() {
      // 要通过服务器返回的数组得到一个长度一样的数组，只不过里面的元素有点不一样
      // 所以应该用map进行映射
      return this.suggestList.map((v) => {
        // 把搜索的关键字找到，并替换成带span的效果
        return v.replace(
          this.key,
          `<span style="color:red;">${this.key}</span>`
        );
      });
    },
  },
};
</script>

<style>
</style>